package com.xiaozhi.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.xiaozhi.entity.HealthAnalytics;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;

/**
 * 健康数据分析服务接口
 *
 * @author xiaozhi
 * @since 2024-01-15
 */
public interface HealthAnalyticsService extends IService<HealthAnalytics> {

    /**
     * 生成用户健康数据分析
     *
     * @param userId       用户ID
     * @param analysisType 分析类型
     * @param startDate    分析开始时间
     * @param endDate      分析结束时间
     * @return 分析结果
     */
    HealthAnalytics generateHealthAnalysis(Long userId, String analysisType, LocalDateTime startDate, LocalDateTime endDate);

    /**
     * 生成生命体征分析
     *
     * @param userId    用户ID
     * @param startDate 开始时间
     * @param endDate   结束时间
     * @return 生命体征分析结果
     */
    HealthAnalytics generateVitalSignsAnalysis(Long userId, LocalDateTime startDate, LocalDateTime endDate);

    /**
     * 生成健康趋势分析
     *
     * @param userId    用户ID
     * @param startDate 开始时间
     * @param endDate   结束时间
     * @return 健康趋势分析结果
     */
    HealthAnalytics generateHealthTrendAnalysis(Long userId, LocalDateTime startDate, LocalDateTime endDate);

    /**
     * 生成风险评估分析
     *
     * @param userId    用户ID
     * @param startDate 开始时间
     * @param endDate   结束时间
     * @return 风险评估分析结果
     */
    HealthAnalytics generateRiskAssessment(Long userId, LocalDateTime startDate, LocalDateTime endDate);

    /**
     * 生成症状模式分析
     *
     * @param userId    用户ID
     * @param startDate 开始时间
     * @param endDate   结束时间
     * @return 症状模式分析结果
     */
    HealthAnalytics generateSymptomPatternAnalysis(Long userId, LocalDateTime startDate, LocalDateTime endDate);

    /**
     * 分页查询用户健康分析记录
     *
     * @param userId   用户ID
     * @param pageNum  页码
     * @param pageSize 页大小
     * @return 分页结果
     */
    IPage<HealthAnalytics> getAnalyticsByUserId(Long userId, Integer pageNum, Integer pageSize);

    /**
     * 根据分析类型查询用户分析记录
     *
     * @param userId       用户ID
     * @param analysisType 分析类型
     * @return 分析记录列表
     */
    List<HealthAnalytics> getAnalyticsByType(Long userId, String analysisType);

    /**
     * 获取用户最新的健康分析记录
     *
     * @param userId 用户ID
     * @param limit  限制数量
     * @return 最新分析记录列表
     */
    List<HealthAnalytics> getRecentAnalytics(Long userId, Integer limit);

    /**
     * 获取用户健康评分趋势
     *
     * @param userId    用户ID
     * @param startDate 开始时间
     * @param endDate   结束时间
     * @return 健康评分趋势数据
     */
    List<Map<String, Object>> getHealthScoreTrend(Long userId, LocalDateTime startDate, LocalDateTime endDate);

    /**
     * 获取用户健康统计数据
     *
     * @param userId 用户ID
     * @return 统计数据
     */
    Map<String, Object> getHealthStatistics(Long userId);

    /**
     * 获取用户未读的高风险分析记录
     *
     * @param userId 用户ID
     * @return 未读高风险记录列表
     */
    List<HealthAnalytics> getUnreadHighRiskAnalytics(Long userId);

    /**
     * 标记分析记录为已读
     *
     * @param analyticsId 分析记录ID
     * @return 是否成功
     */
    boolean markAsRead(Long analyticsId);

    /**
     * 批量标记分析记录为已读
     *
     * @param analyticsIds 分析记录ID列表
     * @return 是否成功
     */
    boolean batchMarkAsRead(List<Long> analyticsIds);

    /**
     * 删除分析记录
     *
     * @param analyticsId 分析记录ID
     * @param userId      用户ID（用于权限验证）
     * @return 是否成功
     */
    boolean deleteAnalytics(Long analyticsId, Long userId);

    /**
     * 获取用户最新的各类型分析记录
     *
     * @param userId 用户ID
     * @return 最新各类型分析记录
     */
    List<HealthAnalytics> getLatestAnalyticsByType(Long userId);

    /**
     * 获取用户月度健康分析汇总
     *
     * @param userId 用户ID
     * @param year   年份
     * @param month  月份
     * @return 月度汇总数据
     */
    Map<String, Object> getMonthlySummary(Long userId, Integer year, Integer month);

    /**
     * 获取用户健康改善趋势
     *
     * @param userId    用户ID
     * @param startDate 开始时间
     * @param endDate   结束时间
     * @return 改善趋势数据
     */
    Map<String, Object> getImprovementTrend(Long userId, LocalDateTime startDate, LocalDateTime endDate);

    /**
     * 计算健康评分
     *
     * @param userId    用户ID
     * @param startDate 开始时间
     * @param endDate   结束时间
     * @return 健康评分（0-100）
     */
    Integer calculateHealthScore(Long userId, LocalDateTime startDate, LocalDateTime endDate);

    /**
     * 评估风险等级
     *
     * @param userId       用户ID
     * @param healthScore  健康评分
     * @param analysisData 分析数据
     * @return 风险等级
     */
    String assessRiskLevel(Long userId, Integer healthScore, Map<String, Object> analysisData);

    /**
     * 生成健康建议
     *
     * @param userId       用户ID
     * @param analysisType 分析类型
     * @param analysisData 分析数据
     * @param riskLevel    风险等级
     * @return 健康建议
     */
    String generateRecommendations(Long userId, String analysisType, Map<String, Object> analysisData, String riskLevel);

    /**
     * 检测异常指标
     *
     * @param userId       用户ID
     * @param analysisData 分析数据
     * @return 异常指标列表
     */
    List<String> detectAbnormalIndicators(Long userId, Map<String, Object> analysisData);

    /**
     * 分析趋势方向
     *
     * @param userId       用户ID
     * @param analysisType 分析类型
     * @param currentData  当前数据
     * @param historicalData 历史数据
     * @return 趋势方向
     */
    String analyzeTrendDirection(Long userId, String analysisType, Map<String, Object> currentData, List<Map<String, Object>> historicalData);

    /**
     * 获取系统整体健康统计数据
     *
     * @return 系统统计数据
     */
    Map<String, Object> getSystemHealthStats();

    /**
     * 清理过期的分析记录
     *
     * @param daysToKeep 保留天数
     * @return 清理数量
     */
    int cleanupExpiredRecords(Integer daysToKeep);

    /**
     * 导出用户健康分析报告
     *
     * @param userId    用户ID
     * @param startDate 开始时间
     * @param endDate   结束时间
     * @param format    导出格式（PDF、EXCEL等）
     * @return 报告文件路径或内容
     */
    String exportHealthReport(Long userId, LocalDateTime startDate, LocalDateTime endDate, String format);

    /**
     * 预测健康趋势
     *
     * @param userId       用户ID
     * @param analysisType 分析类型
     * @param days         预测天数
     * @return 预测结果
     */
    Map<String, Object> predictHealthTrend(Long userId, String analysisType, Integer days);

    /**
     * 比较用户健康数据与同龄人群
     *
     * @param userId 用户ID
     * @return 比较结果
     */
    Map<String, Object> compareWithPeers(Long userId);

    /**
     * 生成个性化健康目标
     *
     * @param userId       用户ID
     * @param analysisData 分析数据
     * @return 健康目标列表
     */
    List<Map<String, Object>> generateHealthGoals(Long userId, Map<String, Object> analysisData);
}